﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML><HEAD><TITLE>KeyWait</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8"><LINK 
href="../css/commands.css" type=text/css rel=stylesheet><LINK media=print 
href="../css/print.css" type=text/css rel=stylesheet>
<META content="MSHTML 6.00.6000.16705" name=GENERATOR></HEAD>
<BODY>
<H1>KeyWait</H1>


<P>等待一个按键或鼠标/操纵杆按钮被松开或者按下。</P>
<P class=CommandSyntax>KeyWait, KeyName [, Options]</P>
<h3>参数 </h3>
<TABLE borderColor=#c0c0c0 cellSpacing=0 cellPadding=3 width="100%" border=1>
  <TBODY>
  <TR>
    <TD width="15%">KeyName</TD>
    <TD width="85%">
      <P>这个名称可以是键盘上的几乎任意单独字符或者是 <A 
      href="../KeyList.htm">按键列表</A>&nbsp;里的某个按键名称，例如一个鼠标/操纵杆按钮。不支持除了操纵杆的按钮外的操纵杆属性。</P>
      <P>也可以指定一个显式的虚拟按键代码例如 
      vkFF&nbsp;。当一个按键没有名称并且在按下时生成不可见的字符这种罕见的情况时，这会很有用。它的虚拟按键代码可以通过参照 <A 
      href="../KeyList.htm#SpecialKeys">按键列表页面</A>&nbsp;底部的步骤来确定。</P></TD></TR>
  <TR>
    <TD>Options</TD>
    <TD>
      <P>如果此参数为空，命令将无限期地等待用户自己松开指定的按键或鼠标/操纵杆按钮。不过，如果没有安装 <A 
      href="_InstallKeybdHook.htm">键盘钩子</A> 并且 <EM>KeyName</EM> 是通过例如 <A 
      href="Send.htm">Send</A> 命令人为地松开的一个键盘按键，按键将被视为物理地松开了。当没有安装 <A 
      href="_InstallMouseHook.htm">鼠标钩子</A> 时，对鼠标按键来说也是一样的。</P>
      <P>Options: 一个下列单个或多个字母组成的字符串(可任意顺序，在中间的空格是可选的):</P>
      <P><STRONG>D</STRONG>: 等待按键被按下。</P>
      <P><STRONG>L</STRONG>: 
      检测按键的逻辑状态，这是操作系统和激活的窗口相信按键会一直处于的状态(不一定和物理的状态一样)。<SPAN 
      style="COLOR: rgb(0,153,0)">译注：按键被检测时所处的状态会成为它</SPAN><SPAN 
      style="COLOR: rgb(0,153,0)">永远的状态而不管之后是否物理地改变。</SPAN>此选项忽略操纵杆按钮。</P>
      <P><STRONG>T</STRONG>: 超时(例如，T3)。在判定超时并设置 <A 
      href="../misc/ErrorLevel.htm">ErrorLevel</A> 为 1 
      之前要等待的秒数。如果按键或按钮达到了指定的状态，命令不会等到超时期满。反而，它将马上设置 <A 
      href="../misc/ErrorLevel.htm">ErrorLevel</A> 为 0 并且脚本将继续执行。</P>
      <P>超时的参数值可以是一个浮点数例如 2.5 ，但不能是一个十六进制的数值例如&nbsp; 0x03 
。</P></TD></TR></TBODY></TABLE>
<h3>ErrorLevel</h3>
<P>如果命令超时&nbsp;<A href="../misc/ErrorLevel.htm">ErrorLevel</A> 将设为 1&nbsp;，反之为 0 
。</P>
<h3>注意</h3>
<P>在 Windows Me/98/95 下，一个按键或鼠标按键的物理状态将一直和它的逻辑状态一致。</P>
<P>在 Windows NT/2k/XP 
以及之后版本，一个按键或鼠标按键的物理状态通常将和逻辑状态一致，除非安装了键盘和/或鼠标钩子，这种情况下它会精确地反映逻辑状态而无论用户是否物理地按住了按键。通过 
<A href="KeyHistory.htm">KeyHistory</A> 的命令或菜单项你能确定你的脚本是否在使用钩子。你能通过给脚本添加 <A 
href="_InstallKeybdHook.htm">#InstallKeybdHook</A> 和 <A 
href="_InstallMouseHook.htm">#InstallMouseHook</A> 指令来强制安装任何一个或两个钩子。</P>
<P>当命令处于一个等待状态时，新的 <A href="../misc/Threads.htm">threads</A>(线程) 能通过 <A 
href="../Hotkeys.htm">hotkey</A>,&nbsp;<A href="Menu.htm">自定义菜单项</A> 或 <A 
href="SetTimer.htm">timer</A> 来启动。</P>
<P>要等待两个或多个按键被松开，请连续地使用 KeyWait 。例如：</P><PRE>KeyWait Control  <SPAN class=CodeCom>; 等待 Control 和 Alt 两个都被松开。</SPAN>
KeyWait Alt</PRE>
<P>要等待一系列按键中的某个按键被按下，请看 <A href="Input.htm">Input</A> 命令的示例部分。</P>
<h3>相关命令</h3>
<P><A href="GetKeyState.htm">GetKeyState</A>, <A href="../KeyList.htm">Key 
List</A>, <A href="Input.htm">Input</A>, <A 
href="KeyHistory.htm">KeyHistory</A>, <A 
href="_InstallKeybdHook.htm">#InstallKeybdHook</A>, <A 
href="_InstallMouseHook.htm">#InstallMouseHook</A>, <A 
href="ClipWait.htm">ClipWait</A>, <A href="WinWait.htm">WinWait</A></P>
<h3>示例</h3><PRE class=NoIndent><SPAN class=CodeCom>; 例子 #1: 基本用法：</SPAN>
KeyWait, a  <SPAN class=CodeCom>; 等待按键 A 被松开。</SPAN>
KeyWait, LButton, D  <SPAN class=CodeCom>; 等待鼠标左键被按下。</SPAN>
KeyWait, Joy1, D T3  <SPAN class=CodeCom>; 等待首个操纵杆按钮在 3 秒内按下。</SPAN>
KeyWait, LAlt, L  <SPAN class=CodeCom>; 等待左边的 Alt 键被逻辑地松开。</SPAN></PRE>
<P>&nbsp;</P><PRE class=NoIndent><SPAN class=CodeCom>; 例子 #2: 一个简单的热键：</SPAN>
~Capslock::
KeyWait, Capslock  <SPAN class=CodeCom>; 等待用户物理地松开它。</SPAN>
MsgBox 你按了并且松开了 Capslock 键。
return</PRE>
<P>&nbsp;</P><PRE class=NoIndent><SPAN class=CodeCom>; 例子 #3: 重映射一个按键或鼠标按钮 (这仅是为了阐述，因为</SPAN><SPAN class=CodeCom>使用 <A href="../misc/Remap.htm">内置重映射特性</A> 会更加简单):</SPAN>
<SPAN class=CodeCom>; 当</SPAN><SPAN class=CodeCom> NumpadAdd 按下时鼠标左键是按住的，这实际上把</SPAN><SPAN class=CodeCom> NumpadAdd 变成了鼠标左键。</SPAN><SPAN class=CodeCom></SPAN>
<SPAN class=CodeCom></SPAN>
*NumpadAdd::
MouseClick, left,,, 1, 0, D  <SPAN class=CodeCom>; 按住鼠标左键。</SPAN>
KeyWait, NumpadAdd  <SPAN class=CodeCom>; 等待按键被松开。</SPAN>
MouseClick, left,,, 1, 0, U  <SPAN class=CodeCom>; 松开鼠标按键。</SPAN>
return</PRE>
<P>&nbsp;</P><PRE class=NoIndent><SPAN class=CodeCom>; 例子 #4: 检测何时一个按键被两次按下 (近似于双击)。</SPAN>
<SPAN class=CodeCom>; </SPAN><SPAN class=CodeCom>当你按住 RControl 键要修饰另一个按键时，</SPAN><SPAN class=CodeCom>KeyWait 被用来阻止键盘的自动重复特性创造出一个不需要的两次按键。</SPAN><SPAN class=CodeCom></SPAN>
<SPAN class=CodeCom>; 它通过</SPAN><SPAN class=CodeCom>依赖于</SPAN><SPAN class=CodeCom> #MaxThreadsPerHotkey 处于</SPAN><SPAN class=CodeCom>它</SPAN><SPAN class=CodeCom>的</SPAN><SPAN class=CodeCom>默认设置 1 </SPAN><SPAN class=CodeCom>来保持住热键的线程运行从而</SPAN><SPAN class=CodeCom>阻止自动重复。</SPAN><SPAN class=CodeCom></SPAN><SPAN class=CodeCom></SPAN>
<SPAN class=CodeCom>; 注意：在</SPAN><SPAN class=CodeCom> <A href="SetTimer.htm">SetTimer</A> 页面的底部有一个更复杂的脚本来辨别单次、两次和三次按键之间的区别。</SPAN>
~RControl::
if (A_PriorHotkey &lt;&gt; "~RControl" or A_TimeSincePriorHotkey &gt; 400)
{
    <SPAN class=CodeCom>; 在按键之间间隔太久，所以这不是一个两次按键。</SPAN>
    KeyWait, RControl
    return
}
MsgBox 你两次按击了右边的 control 键。
return</PRE>
</BODY></HTML>
